public class question_32 {
}
class Solution_32 {
    public int longestValidParentheses(String s) {
//        第一种，我的解法
///////////////////////////////////////////////////
//        特殊
        if(s==null||s.length()==0){
            return 0;
        }
//        index 表示目前栈中(的数量，只有(才进栈，)只是进行判断
        int index=0;
        char[] arr = s.toCharArray();
//        记录最大的子串长度
        int max=0;
//        i 用于记录某一次的长度
        int i=0;
        int no_value_len=0;
//      在进入循环之前先去掉末尾的左括号
        int start=0;
        for (int j = arr.length-1; j >=0; j--) {
            if(arr[j]=='('){
                no_value_len++;
            }else {
                break;
            }
        }
        for (int j = 0; j < s.length()-no_value_len; j++) {
            if(arr[j]=='(' ){
                i++;
                index++;
            }else {
//               说明是（
                if(index!=0){
//                    还是有效子串
                    index--;
                    i++;
                }else{
//                    记录更新
//                    start=j+1;
                    if(i>max){
                        max=i;
                    }
                    i=0;
                }
            }
        }

        //      最后一步
//        max=i-index>max?(i-index):max;
//        采用最多连续一的方式进行处理最后一种情况
//        最后一种情况是()(()这种，特点是：）没问题，（ 多了，且最后是）结尾
//        上面的i已经统计了最后这个的长度，也就是倒数i个字符的子串
        String substr=s.substring(arr.length-no_value_len-i,arr.length-no_value_len);
        char err[]=substr.toCharArray();
        int err_value[]=new int[err.length];
        int head=0;
        for (int j = 0; j <err.length ; j++) {
            if(err[j]=='('){
                head=j;
            }else{
                err_value[j]=1;
                err_value[head]=1;
                for (int k = head; k >=0; k--) {
                    if(err_value[k]==0){
                        head=k;
                        break;
                    }
                }
            }
        }
//        统计连续1的最大个数，就是最后子串的最大长度
        int max_temp=0;
        i=0;
        for (int j = 0; j < err_value.length; j++) {
            if(err_value[j]==0){
                if(i>max_temp){
                    max_temp=i;
                }
//                重新开始
                i=0;
            }else {
                i++;
            }
        }
//      最后一个i
        if(i>max_temp){
            max_temp=i;
        }

        return max>max_temp?max:max_temp;

    }

    public static void main(String[] args) {
        Solution_32 solution_32=new Solution_32();
        int i = solution_32.longestValidParentheses("(()");
        System.out.println(i);
    }
}
